package gemsa.modeles;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;
import gemsa.beans.Axe;
import gemsa.outils.GestionBaseDeDonnees;


/**
 * Classe ModeleAxe
 * @author Projet Dev Groupe 33
 * @version 1.0 Finale
 */
 
public class ModeleAxe 
{
	// Variables
	DataSource datasource=null;
	Connection connexion=null;
	ResultSet resultat=null;
	
	// Variables de pagination
	private int maxParPage;
	private int pageActuel;
	private int totalElement;
	private String champTri;
	private String typeTri;
	// private String recherche;
	// private String typerecherche;
	
	// Constructeur
	public ModeleAxe(DataSource datasource)
	{		
		// On r�cup�re le DataSource de la servlet
		this.datasource=datasource;
	}
	
	// Accesseurs
	public int getMaxParPage() 
	{
		return maxParPage;
	}

	public int getPageActuel() 
	{
		return pageActuel;
	}

	public int getTotalElement() 
	{
		return totalElement;
	}
	
	public String getChampTri()
	{
		return champTri;
	}

/* 	public String getRecherche()
	{
		return recherche;
	} */

	public String getTypeTri() 
	{
		return typeTri;
	}
	
/* 	public String getTyperecherche() 
	{
		return typerecherche;
	} */
	
	// Retourner la liste des axes
	public List<Axe> listeAxe()
	{
		// Variables
		PreparedStatement requete=null;
		Axe axe=null;
		String requeteString=null;
		List<Axe> listeAxe=new ArrayList<Axe>();
		
		try
		{
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="SELECT * FROM axe ORDER BY nomaxe ASC";
			
			// On pr�pare la requ�te
			requete=connexion.prepareStatement(requeteString);
				
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					axe=axeAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste des axes
					listeAxe.add((Axe)axe);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction listeAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction listeAxe");
			}	
		}
		
		// Retourner la liste des axes
		return listeAxe;
	}
	
	
	
	// R�cup�rer un axe
	public Axe getAxe(int idAxe)
	{
		// Variables
		PreparedStatement requete=null;
		Axe axe=null;
		String requeteString=null;
		
		try
		{
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="SELECT * FROM axe where id_axe=?";
			
			// On pr�pare la requ�te
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1,idAxe);
				
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans l'objet axe
			if(resultat!=null)
			{
				if(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					axe=axeAttributsMapper(resultat);
				}
			}
		}
		catch(Exception e)
		{
			axe=null;
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction GetAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction GetAxe");
			}	
		}
		

		// Retourner l'axe souhait�e
		return axe;
	}
	
	
	// R�cup�rer l'axe
	public Axe getAxe(String nom)
	{
		// Variables
		PreparedStatement requete=null;
		Axe axe=null;
		String requeteString=null;
		
		try
		{
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="SELECT * FROM axe where nomaxe = ?";
			
			// On pr�pare la requ�te
			requete=connexion.prepareStatement(requeteString);
			requete.setString(1,nom);
				
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans l'objet axe
			if(resultat!=null)
			{
				if(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					axe=axeAttributsMapper(resultat);
				}
			}
		}
		catch(Exception e)
		{
			axe=null;
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction GetAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction GetAxe");
			}	
		}
		
		// Retourner l'axe souhait�
		return axe;
	}
	
	
	
	
	/* =========================================
	 * Partie Admin
	 * =========================================
	 */
	
	// Retourner la liste des axes
	public List<Axe> listeAxePaginer(int maxParPage, int pageActuel, /* String recherche, String typerecherche, */ String champTri, String typeTri)
	{	
		// Variables
		PreparedStatement requete=null;
		Axe axe=null;
		String requeteString=null;
		List<Axe> listeAxe=new ArrayList<Axe>();
		int position=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Premi�re requ�te : on r�cup�re le nombre total de axes
			requeteString="SELECT COUNT(DISTINCT(id_axe)) as total FROM axe WHERE 1";
			
			// Si il s'agit d'une recherche, on modifie la requ�te en cons�quence
			/* if((recherche!=null && !recherche.equalsIgnoreCase("")) && (typerecherche!=null && !typerecherche.equals("")))
			{
				requeteString+=" AND " + typerecherche + " like ?";
				
				// Pr�paration de la requ�te
				requete=connexion.prepareStatement(requeteString);
				requete.setString(1,"%" + recherche + "%");
			} */
			// On compte le nombre total de axes
/* 			else
			{ */
				// Pr�paration de la requ�te
				requete = connexion.prepareStatement(requeteString);
			// }
			
			// Execution de la requ�te
			resultat=requete.executeQuery();
			
			// On r�cup�re le nombre d'axes
			if(resultat!=null)
			{
				if(resultat.next())
				{
					this.totalElement=resultat.getInt("total");
				}
			}
			
			// On v�rifie que la page demand�e est valable
			position=maxParPage*(pageActuel-1);
			if(position>totalElement || maxParPage>totalElement)
			{
				pageActuel=1;
			}
			
			// On d�finit les variables de pagination finales
			position=maxParPage*(pageActuel-1);
			this.maxParPage=maxParPage;
			this.pageActuel=pageActuel;
			// this.recherche=recherche;
			this.champTri=champTri;
			this.typeTri=typeTri;
			// this.typerecherche=typerecherche;
		
			// Deuxi�me requ�te : on r�cup�re la liste suivant une pagination
			requeteString="SELECT * FROM axe WHERE 1";
			
			// Si il s'agit d'une recherche, on modifie la requ�te en cons�quence
			/* if((recherche!=null && !recherche.equalsIgnoreCase("")) && (typerecherche!=null && !typerecherche.equals("")))
			{
				requeteString+=" AND " + typerecherche + " like ?";
				requeteString+=" ORDER BY " + champTri + " " + typeTri + " LIMIT " + position + "," + maxParPage;
				
				// Pr�paration de la requ�te
				requete=connexion.prepareStatement(requeteString);
				requete.setString(1,"%" + recherche + "%");
			} */
			// Dans le cas contraire on liste toutes les axes
			// else
			// {
				requeteString+=" ORDER BY " + champTri + " " + typeTri + " LIMIT " + position + "," + maxParPage;
				
				// Pr�paration de la requ�te
				requete=connexion.prepareStatement(requeteString);
			// }
	
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mappage des attributs avec les champs de la table SQL
					axe=axeAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste des axes
					listeAxe.add((Axe)axe);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction listeAxePaginer");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction listeAxePaginer");
			}	
		}
		
		// Retourner la liste des axes
		return listeAxe;
	}
	
	
	
	// Ajouter un axe
	public int ajouterAxe(Axe axe)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="INSERT INTO axe (nomaxe) VALUES(?)";
			
			// Pr�paration de la requ�te
			requete=connexion.prepareStatement(requeteString);
			requete.setString(1, axe.getNom());
			
			// On vide l'axe par s�curit�
			axe=null;
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			codeErreur=0;
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction ajouterAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction ajouterAxe");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	
	// Supprimer un axe
	public int supprimerAxe(int idAxe)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
		
			// Cr�ation de la premi�re requ�te : on d�place tous les sous-axes de l'axe dans l'axe nomm� "autre"
			requeteString="UPDATE ssaxe SET id_axe = 1 WHERE id_axe = ?";
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1, idAxe);
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
			
			// Cr�ation de la deuxi�me requ�te : suppression de l'axe
			requeteString="DELETE FROM axe WHERE id_axe = ?";
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1, idAxe);
			
			// On vide l'id de l'axe par s�curit�
			idAxe=0;
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			codeErreur=0;
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction supprimerAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction supprimerAxe");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	// Modifier un axe
	public int modifierAxe(Axe axe)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="UPDATE axe set nomaxe = ? WHERE id_axe = ?";
			requete=connexion.prepareStatement(requeteString);
			requete.setString(1, axe.getNom());
			requete.setInt(2, axe.getId());
				
			// On vide l'axe par s�curit�
			axe=null;
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleAxe fonction modifierAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleAxe fonction modifierAxe");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	

	
	
	// Transformation du Relationnel vers Objet
	public Axe axeAttributsMapper(ResultSet resultat)
	{
		// Variables
		Axe axe=new Axe();
		
		try
		{	
			// On renseigne l'objet axe
			if(resultat.getString("id_axe")==null)
			{
				axe.setId(0);
			}
			else
			{
				axe.setId(resultat.getInt("id_axe"));
			}
			
			if(resultat.getString("nomaxe")==null)
			{
				axe.setNom("");
			}
			else
			{
				axe.setNom(resultat.getString("nomaxe"));
			}
			
			if(resultat.getString("etataxe")==null)
			{
				
				axe.setEtat(0);
			}
			else
			{
				axe.setEtat(resultat.getInt("etataxe"));
			}
			
		}
		catch (Exception e) 
		{
			// Si il y a une erreur durant le mapping des attributs avec la base on renvoie un objet null
			axe=null;
			System.out.println("Erreur lors du mappage des attributs d'un axe la classe ModeleAxe fonction AxeAttributsMapper");
		}
		
		// On retourne l'axe 
		return axe;
	}
	
}